
/**
 * @author Sebastian
 * @version 2.0
 * @date 2024/7/17 21:30
 */
// 乘积最大子数组
    // https://leetcode.cn/problems/maximum-product-subarray/
    // 首先假设存在某个最大乘积，然后对数组遍历，在经过每个元素的时候，有以下四种情况：
//
//如果该元素为正数：
//如果到上一个元素为止的最大乘积也是正数，那么直接乘上就好了，同样的最大乘积也会变得更大
//如果到上一个元素为止的最大乘积是负数，那么最大乘积就会变成该元素本身，且连续性被断掉
//如果该元素为负数：
//如果到上一个元素为止的最大乘积也是负数，那么直接乘上就好了，同样的最大乘积也会变得更大
//如果到上一个元素为止的最大乘积是正数，那么最大乘积就会不变，且连续性被断掉
//以上四种情况中说到的最大乘积都是临时最大乘积，每遍历新的元素都需要进行比较来确定真正的最大乘积。
public class Solution152 {
    public int maxProduct(int[] nums) {
        int len = nums.length;
        int res = Integer.MIN_VALUE;
        int imax = 1, imin = 1;
        for (int i = 0; i < len; i++) {
            // 连续性被中断
            if (nums[i] < 0) {
                int tmp = imax;
                imax = imin;
                imin = tmp;
            }
            imax = Math.max(imax * nums[i], nums[i]);
            imin = Math.min(imin * nums[i], nums[i]);
            res = Math.max(imax, res);
        }
        return res;
    }
}
